#pragma once
#include "EventLoop.h"
#include "Socket.h"
#include "Channel.h"
#include "Acceptor.h"
#include "ThreadPool.h"
#include <map>
#include<memory>
class TcpServer {
private:
    int threadnum_;    // 线程池的大小，即从事件循环的个数
    //EventLoop *mainloop_;  // 单线程下暂时只用一个事件循环 主事件循环
    std::unique_ptr<EventLoop> mainloop_;
    std::vector<std::unique_ptr<EventLoop>> subloops_; //存放从事件循环的容器
    Acceptor acceptor_; // 一个TcpServer只有一个Acceptor对象
    ThreadPool threadpool_;
    std::map<int,std::shared_ptr<Connection>> conns_;

    std::function<void(std::shared_ptr<Connection>)> newconnectioncb_;     // 回调 EchoServer::HandleNewConnection()
    std::function<void(std::shared_ptr<Connection>)> closeconnectioncb_;   // 回调 EchoServer::HandleClose()
    std::function<void(std::shared_ptr<Connection>)> errorconnectioncb_;   // 回调 EchoServer::HandleError()
    std::function<void(std::shared_ptr<Connection>, std::string&)> onmessagecb_;  // 回调 EchoServer::HandleMessage()
    std::function<void(std::shared_ptr<Connection>)> sendcompletecb_;       // 回调 EchoServer::HandleSendComplete()
    std::function<void(EventLoop *)> timeoutcb_;             // 回调 EchoServer::HandleTimeout()

public:
    TcpServer(const std::string &ip, const uint16_t port,int thradnum = 3);
    ~TcpServer();

    void start();

    void newconnection(std::unique_ptr<Socket> clientsock);
    void closeconnection(std::shared_ptr<Connection> conn);
    void errorconnection(std::shared_ptr<Connection> conn);
    void haddlemessage(std::shared_ptr<Connection> conn,std::string &message);
    void sendcomplete(std::shared_ptr<Connection> conn);
    void epolltimeout(EventLoop *loop);


    // 设置新连接建立时的回调（参数：Connection指针）
    void setNewConnectionCB(std::function<void(std::shared_ptr<Connection>)> fn);

    // 设置连接关闭时的回调（参数：Connection指针）  
    void setCloseConnectionCB(std::function<void(std::shared_ptr<Connection>)> fn);

    // 设置连接错误时的回调（参数：Connection指针）
    void setErrorConnectionCB(std::function<void(std::shared_ptr<Connection>)> fn);

    // 设置消息到达时的回调（参数：Connection指针 + 消息内容引用）
    void setOnMessageCB(std::function<void(std::shared_ptr<Connection>, std::string& message)> fn);

    // 设置数据发送完成时的回调（参数：Connection指针）
    void setSendCompleteCB(std::function<void(std::shared_ptr<Connection>)> fn);

    // 设置超时事件回调（参数：EventLoop指针）  
    void setTimeoutCB(std::function<void(EventLoop*)> fn);

};